package com.example.administrator.exkotlin.jetpack.viewmodel

import android.util.Log
import android.view.View
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel
import com.example.administrator.exkotlin.jetpack.viewmodel.data.ViewData

/**
 * Author by lp,on 2020/8/28/028,16:40.
 * ViewModel生命周期大于activity因此可以用来保存数据与处理相关逻辑
 * Livedata，可以让观察者观察数据的变化
 * viewModel一般都会与LiveData结合使用
 */
class JetPackViewModel(cout: ViewData) : ViewModel() {
    val TAG = "JetPackViewModel"

    //可修改的数据进行私有化，防止被修改，保证封装性
    private var data = MutableLiveData<ViewData>()

    //get()对外只能做访问不能读取，仅用于观察保证数据的封装
    val observeDat: LiveData<ViewData>
        get() = data

    //使用map()，提供之访问数据中的某些参数，而不是一整个对象
    val count: LiveData<Int> = Transformations.map(data) { data ->
        data.count
    }


    init {
        //初始化的时候将构造函数赋值给data数据
        data.value = cout
    }

    //提供设置数据的方法
    fun plusDataInMain() {
        val count = data.value?.count ?: 0
        //在主线程进行更新使用setValue，在子线程只能使用postValue
        data.value = ViewData("", count + 1)
        Log.i(TAG, data.value.toString())
    }

    fun clearInMain() {
        data.value = ViewData("", 0)
        Log.i(TAG, data.value.toString())
    }


    //当需要获取外部的新的LiveData对象并进行观察的时候，需要使用switchMap()方法
    //因为外部的对象，每次都会新建的情况下，观察到的是老的对象，因此观察不到任何结果
    fun getViewData(str: String, cout: Int): LiveData<ViewData> {
        return Transformations.switchMap(data) { newData ->
            MockRequest.getInfo(str, cout)
        }
    }
    fun refresh(){
        data.value=data.value
    }

    object MockRequest {
        fun getInfo(str: String, cout: Int): LiveData<ViewData> {
            val livedata = MutableLiveData<ViewData>()
            livedata.value = ViewData(info = str, count = cout)
            Log.i("getInfo", livedata.value.toString())
            return livedata
        }
    }

}